Spring的实例化和依赖注入时机与延迟实例化 | 您所在的位置:网站首页 › spring 属性注入 › Spring的实例化和依赖注入时机与延迟实例化 |
Spring的实例化
使用@Autowired可以注入一个bean进来 @Autowired private Diana diana;那么如果在容器中没有Diana的对象被实例化的时候应用程序会报错吗?我们可以通过把Diana上面的@Component注释掉来看一下结果如何 //@Component public class Diana { public void r(){ System.out.println("Diana R"); } } @RestController @RequestMapping("/v1/banner") public class BannerController { @Autowired private Diana diana; }启动SpringBoot会出现以下结果: 当在@Autowired后面加上 (required = false),变成 @RestController @RequestMapping("/v1/banner") public class BannerController { @Autowired(required = false) private Diana diana; @GetMapping("/test") public String test1() { diana.r(); return "Hello test1"; } }SpringBoot可以 正常启动,但是当访问diana下面的方法时会出现下面这样的结果 结论: _如果spring无法在容器中找到Diana的对象,在默认的机制下启动时就会直接报错。我们可以通过@Autowired(required = false)的方式令应用程序可以正常启动。 _ 依赖注入时机IOC容器究竟是在什么时候实例化对象并把对象注入到代码片段里的呢?是当请求访问Controller的时候才进行实例化并注入,还是在SpringBoot应用启动时就开始实例化并把对象注入到代码片段的呢? 由之前的代码可以看出,当把Diana上面的@Component注释掉时,SpringBoot应用启动时应用程序会立即报错,我们也可以通过在Diana这个类中加一个无参的构造方法来验证以下 @Component public class Diana { public Diana() { System.out.println("Hello Diana"); } public void r(){ System.out.println("Diana R"); } }应用程序启动时控制台打印出了"Hello Diana" SpringBoot默认是立即实例化的机制,我们可以通过 @Lazy让它变成延迟实例化。 @Component @Lazy public class Diana {
或者 @Autowired @Lazy private Diana diana;当访问当前的Controller控制台打印出了下面的结果: 如果没有特殊理由最好不要开启延迟实例化。使用默认机制提前实例化才是一个比较好的做法,因为可以尽早发现问题,避免很多问题在运行时才被发现。 |
CopyRight 2018-2019 实验室设备网 版权所有 |